#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
README文件生成器
"""

import os
from datetime import datetime
from typing import Dict, Optional
from utils.logger import get_logger


class ReadmeGenerator:
    """README文件生成器类"""
    
    def __init__(self):
        self.templates = {
            '项目说明': self._basic_template,
            '详细文档': self._detailed_template,
            '简单介绍': self._simple_template,
            '自定义': self._custom_template,
            'AI智能生成': self._ai_generated_template
        }
        self.logger = get_logger("ReadmeGenerator")
    
    def generate_readme_content(self, template_type: str, project_info: Dict[str, str]) -> str:
        """
        生成README内容
        
        Args:
            template_type: 模板类型
            project_info: 项目信息字典
            
        Returns:
            str: README文件内容
        """
        if template_type in self.templates:
            return self.templates[template_type](project_info)
        else:
            return self._basic_template(project_info)
    
    def _basic_template(self, project_info: Dict[str, str]) -> str:
        """基本模板"""
        project_name = project_info.get('name', 'My Project')
        description = project_info.get('description', '这是一个项目说明')
        author = project_info.get('author', '开发者')
        
        content = f"""# {project_name}

## 项目简介

{description}

## 功能特点

- 功能1：待补充
- 功能2：待补充
- 功能3：待补充

## 技术栈

- 技术1
- 技术2
- 技术3

## 快速开始

### 环境要求

- Python 3.7+
- 其他依赖请参考requirements.txt

### 安装步骤

1. 克隆项目
```bash
git clone [项目地址]
cd {project_name.lower().replace(' ', '-')}
```

2. 安装依赖
```bash
pip install -r requirements.txt
```

3. 运行项目
```bash
python main.py
```

## 使用说明

详细的使用说明请参考文档或代码注释。

## 贡献

欢迎提交Issue和Pull Request来改进这个项目！

## 许可证

本项目采用MIT许可证 - 详见 [LICENSE](LICENSE) 文件

## 作者

{author}

---

*Created on {datetime.now().strftime('%Y-%m-%d')} by Gitee仓库批量管理工具*
"""
        return content
    
    def _detailed_template(self, project_info: Dict[str, str]) -> str:
        """详细模板"""
        project_name = project_info.get('name', 'My Project')
        description = project_info.get('description', '这是一个项目说明')
        author = project_info.get('author', '开发者')
        
        content = f"""# {project_name}

<div align="center">
  <h3>{description}</h3>
  
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
  [![Python](https://img.shields.io/badge/python-3.7+-blue.svg)](https://python.org)
  [![Status](https://img.shields.io/badge/status-active-success.svg)]()
</div>

## 📋 目录

- [项目简介](#项目简介)
- [功能特点](#功能特点)
- [技术架构](#技术架构)
- [快速开始](#快速开始)
- [使用指南](#使用指南)
- [API文档](#api文档)
- [配置说明](#配置说明)
- [常见问题](#常见问题)
- [贡献指南](#贡献指南)
- [版本历史](#版本历史)
- [许可证](#许可证)

## 🚀 项目简介

{description}

### 背景

项目开发背景和目标。

### 目标

- 目标1
- 目标2
- 目标3

## ✨ 功能特点

- ✅ **功能1** - 功能描述
- ✅ **功能2** - 功能描述
- ✅ **功能3** - 功能描述
- 🚧 **功能4** - 开发中
- 📋 **功能5** - 计划中

## 🏗️ 技术架构

### 系统架构

```
项目结构描述
```

### 技术栈

- **前端**: 技术栈
- **后端**: 技术栈
- **数据库**: 技术栈
- **部署**: 技术栈

## 🚀 快速开始

### 环境要求

- Python 3.7+
- Node.js 14+ (如果有前端)
- 数据库 (如果需要)

### 安装步骤

1. **克隆项目**
```bash
git clone [项目地址]
cd {project_name.lower().replace(' ', '-')}
```

2. **安装依赖**
```bash
pip install -r requirements.txt
```

3. **配置环境**
```bash
cp config.example.json config.json
# 编辑配置文件
```

4. **初始化数据库**
```bash
python init_db.py
```

5. **运行项目**
```bash
python main.py
```

## 📖 使用指南

### 基本用法

详细的使用步骤和示例。

### 高级功能

高级功能的使用方法。

## 📚 API文档

如果是API项目，在这里描述API接口。

## ⚙️ 配置说明

配置文件的详细说明。

## ❓ 常见问题

### Q: 问题1?
A: 解答1

### Q: 问题2?
A: 解答2

## 🤝 贡献指南

1. Fork 本项目
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 打开Pull Request

## 📝 版本历史

- **v1.0.0** - {datetime.now().strftime('%Y-%m-%d')} - 初始版本

## 📄 许可证

本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。

## 👨‍💻 作者

**{author}**

- Email: [your-email@example.com]
- GitHub: [@your-username]

---

<div align="center">
  <sub>Built with ❤️ by {author}</sub><br>
  <sub>Generated by Gitee仓库批量管理工具 on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}</sub>
</div>
"""
        return content
    
    def _simple_template(self, project_info: Dict[str, str]) -> str:
        """简单模板"""
        project_name = project_info.get('name', 'My Project')
        description = project_info.get('description', '这是一个项目说明')
        
        content = f"""# {project_name}

{description}

## 使用方法

```bash
git clone [项目地址]
cd {project_name.lower().replace(' ', '-')}
pip install -r requirements.txt
python main.py
```

## 许可证

MIT License

---
*Created on {datetime.now().strftime('%Y-%m-%d')}*
"""
        return content
    
    def _custom_template(self, project_info: Dict[str, str]) -> str:
        """自定义模板"""
        project_name = project_info.get('name', 'My Project')
        description = project_info.get('description', '这是一个项目说明')
        
        content = f"""# {project_name}

{description}

## 自定义README模板

请根据您的项目需求修改此README文件。

您可以添加以下内容：
- 项目描述
- 安装说明
- 使用示例
- 贡献指南
- 许可证信息

## 开始编辑

删除此部分，添加您的项目内容。

---
Generated on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
"""
        return content
    
    def check_readme_exists(self, project_path: str) -> bool:
        """
        检查项目目录中是否已存在README文件
        
        Args:
            project_path: 项目路径
            
        Returns:
            bool: README文件是否存在
        """
        readme_path = os.path.join(project_path, 'README.md')
        return os.path.exists(readme_path)
    
    def generate_ai_readme(self, project_path_or_repo: str, project_info: Dict[str, str]) -> Optional[str]:
        """
        使用DeepSeek AI生成README内容
        
        Args:
            project_path_or_repo: 项目路径（本地）或仓库完整名称（API模式）
            project_info: 项目信息
            
        Returns:
            str: AI生成的README内容，失败时返回None
        """
        try:
            from core.deepseek_ai import deepseek_ai
            
            # 判断是本地路径还是仓库名称
            if os.path.exists(project_path_or_repo):
                # 本地路径模式
                analysis = deepseek_ai.analyze_project_files(project_path_or_repo)
                prompt = self._build_ai_readme_prompt(project_info, analysis, project_path_or_repo)
            else:
                # API模式 - 基于仓库信息生成
                analysis = self._analyze_repo_info(project_path_or_repo, project_info)
                prompt = self._build_api_readme_prompt(project_info, analysis, project_path_or_repo)
            
            # 调用DeepSeek AI生成README
            if deepseek_ai.use_local_analysis:
                return self._generate_local_ai_readme(project_info, analysis)
            else:
                return self._call_deepseek_api(prompt)
                
        except Exception as e:
            self.logger.error(f"AI生成README失败: {e}")
            return None
    
    def _analyze_repo_info(self, repo_full_name: str, project_info: Dict[str, str]) -> Dict:
        """分析仓库信息（API模式）"""
        try:
            # 从仓库名称中提取信息
            repo_parts = repo_full_name.split('/')
            repo_name = repo_parts[-1] if len(repo_parts) > 1 else repo_full_name
            
            # 基于仓库名称推测项目类型和技术栈
            name_lower = repo_name.lower()
            
            # 检测项目类型
            if 'web' in name_lower or 'frontend' in name_lower or 'ui' in name_lower:
                project_type = 'Web前端应用'
                technologies = ['HTML', 'CSS', 'JavaScript']
            elif 'backend' in name_lower or 'api' in name_lower or 'server' in name_lower:
                project_type = '后端服务'
                technologies = ['Python', 'Node.js', 'Java']
            elif 'mobile' in name_lower or 'app' in name_lower:
                project_type = '移动应用'
                technologies = ['React Native', 'Flutter', 'Swift']
            elif 'desktop' in name_lower or 'client' in name_lower:
                project_type = '桌面应用'
                technologies = ['Electron', 'Qt', 'WPF']
            else:
                project_type = '软件开发项目'
                technologies = ['Python', 'JavaScript', 'HTML']
            
            # 检测技术栈
            if 'react' in name_lower:
                technologies.extend(['React', 'JSX', 'Webpack'])
            elif 'vue' in name_lower:
                technologies.extend(['Vue.js', 'Vuex', 'Vue Router'])
            elif 'angular' in name_lower:
                technologies.extend(['Angular', 'TypeScript', 'RxJS'])
            elif 'spring' in name_lower:
                technologies.extend(['Spring Boot', 'Java', 'Maven'])
            elif 'django' in name_lower:
                technologies.extend(['Django', 'Python', 'SQLite'])
            elif 'flask' in name_lower:
                technologies.extend(['Flask', 'Python', 'SQLAlchemy'])
            elif 'express' in name_lower:
                technologies.extend(['Express.js', 'Node.js', 'MongoDB'])
            elif 'laravel' in name_lower:
                technologies.extend(['Laravel', 'PHP', 'MySQL'])
            
            return {
                'project_type': project_type,
                'technologies': list(set(technologies)),
                'language': technologies[0] if technologies else 'Unknown',
                'framework': technologies[1] if len(technologies) > 1 else 'Unknown',
                'keywords': [project_type] + technologies[:3],
                'description': project_info.get('description', f'一个优秀的{project_type}项目'),
                'repo_name': repo_name,
                'repo_full_name': repo_full_name
            }
            
        except Exception as e:
            self.logger.error(f"分析仓库信息失败: {e}")
            return {
                'project_type': '软件开发项目',
                'technologies': ['Python', 'JavaScript'],
                'language': 'Unknown',
                'framework': 'Unknown',
                'keywords': ['项目'],
                'description': project_info.get('description', '一个优秀的项目'),
                'repo_name': repo_full_name,
                'repo_full_name': repo_full_name
            }
    
    def _build_api_readme_prompt(self, project_info: Dict[str, str], analysis: Dict, repo_full_name: str) -> str:
        """构建API模式的AI README生成提示词"""
        project_name = project_info.get('name', 'My Project')
        description = project_info.get('description', '')
        
        prompt = f"""请为以下项目生成一个详细、专业的README.md文件：

项目名称：{project_name}
项目描述：{description}
仓库地址：https://gitee.com/{repo_full_name}
项目类型：{analysis.get('project_type', '软件开发项目')}
编程语言：{analysis.get('language', 'Unknown')}
使用框架：{analysis.get('framework', 'Unknown')}
技术栈：{', '.join(analysis.get('technologies', []))}
关键词：{', '.join(analysis.get('keywords', []))}

请生成一个完整的README.md文件，包含以下部分：
1. 项目标题和简介
2. 功能特性
3. 技术栈
4. 安装指南
5. 使用方法
6. 项目结构
7. 贡献指南
8. 许可证信息

要求：
- 使用Markdown格式
- 内容要详细、专业、易懂
- 根据项目类型和技术栈定制内容
- 包含代码示例和截图说明（用文字描述）
- 使用中文编写
- 格式规范，层次清晰

请直接输出README.md的完整内容："""
        
        return prompt
    
    def _build_ai_readme_prompt(self, project_info: Dict[str, str], analysis: Dict, project_path: str) -> str:
        """构建AI README生成提示词"""
        project_name = project_info.get('name', 'My Project')
        description = project_info.get('description', '')
        
        # 收集项目文件信息
        file_info = self._collect_project_files(project_path)
        
        prompt = f"""请为以下项目生成一个详细、专业的README.md文件：

项目名称：{project_name}
项目描述：{description}
编程语言：{analysis.get('language', 'Unknown')}
使用框架：{analysis.get('framework', 'Unknown')}
关键词：{', '.join(analysis.get('keywords', []))}

项目文件结构：
{file_info}

请生成一个完整的README.md文件，包含以下部分：
1. 项目标题和简介
2. 功能特点
3. 技术栈
4. 安装和使用说明
5. 项目结构
6. 贡献指南
7. 许可证信息

要求：
- 使用中文编写
- 格式规范，使用Markdown语法
- 内容详细且专业
- 适合开源项目展示
- 包含必要的代码示例和说明

请直接返回README.md的完整内容，不要包含其他说明文字。"""
        
        return prompt
    
    def _collect_project_files(self, project_path: str) -> str:
        """收集项目文件信息"""
        try:
            file_info = []
            for root, dirs, files in os.walk(project_path):
                # 跳过隐藏目录和常见忽略目录
                dirs[:] = [d for d in dirs if not d.startswith('.') and d not in ['__pycache__', 'node_modules', 'venv', 'env', 'logs']]
                
                level = root.replace(project_path, '').count(os.sep)
                indent = ' ' * 2 * level
                file_info.append(f"{indent}{os.path.basename(root)}/")
                
                subindent = ' ' * 2 * (level + 1)
                for file in files:
                    if not file.startswith('.') and file not in ['__pycache__', '*.pyc']:
                        file_info.append(f"{subindent}{file}")
            
            return '\n'.join(file_info[:50])  # 限制长度
        except Exception as e:
            self.logger.error(f"收集项目文件信息失败: {e}")
            return "项目文件结构获取失败"
    
    def _generate_local_ai_readme(self, project_info: Dict[str, str], analysis: Dict) -> str:
        """本地智能生成README"""
        project_name = project_info.get('name', 'My Project')
        description = project_info.get('description', '')
        language = analysis.get('language', 'Unknown')
        framework = analysis.get('framework', '')
        keywords = analysis.get('keywords', [])
        
        # 基于分析结果生成更详细的README
        content = f"""# {project_name}

## 项目简介

{description}

## ✨ 功能特点

- 基于{language}开发
{f"- 使用{framework}框架" if framework and framework != 'Unknown' else ""}
{f"- 涉及{', '.join(keywords[:3])}" if keywords else ""}

## 🏗️ 技术栈

- **编程语言**: {language}
{f"- **框架**: {framework}" if framework and framework != 'Unknown' else ""}
{f"- **相关技术**: {', '.join(keywords[:5])}" if keywords else ""}

## 🚀 快速开始

### 环境要求

- {language} 3.7+ (如果适用)
- 其他依赖请参考requirements.txt

### 安装步骤

1. **克隆项目**
```bash
git clone [项目地址]
cd {project_name.lower().replace(' ', '-')}
```

2. **安装依赖**
```bash
pip install -r requirements.txt
```

3. **运行项目**
```bash
python main.py
```

## 📖 使用说明

详细的使用说明请参考代码注释和文档。

## 🤝 贡献指南

欢迎提交Issue和Pull Request来改进这个项目！

## 📄 许可证

本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。

## 👨‍💻 作者

**开发者**

---

<div align="center">
  <sub>Generated by Gitee仓库批量管理工具 on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}</sub>
</div>
"""
        return content
    
    def _call_deepseek_api(self, prompt: str) -> Optional[str]:
        """调用DeepSeek API生成README"""
        try:
            from core.deepseek_ai import deepseek_ai
            
            headers = {
                'Authorization': f'Bearer {deepseek_ai.api_key}',
                'Content-Type': 'application/json'
            }
            
            data = {
                'model': 'deepseek-chat',
                'messages': [
                    {
                        'role': 'system',
                        'content': '你是一个专业的软件项目文档编写专家，擅长为代码项目编写详细、专业的README.md文件。'
                    },
                    {
                        'role': 'user',
                        'content': prompt
                    }
                ],
                'max_tokens': 2000,
                'temperature': 0.7
            }
            
            import requests
            # 从配置获取超时时间
            timeout = int(deepseek_ai.config_manager.get('ai.timeout', '120')) if hasattr(deepseek_ai, 'config_manager') else 120
            response = requests.post(
                f"{deepseek_ai.base_url}/chat/completions",
                headers=headers,
                json=data,
                timeout=timeout
            )
            
            if response.status_code == 200:
                result = response.json()
                content = result['choices'][0]['message']['content'].strip()
                self.logger.info("DeepSeek AI生成README成功")
                return content
            else:
                self.logger.error(f"DeepSeek API调用失败: {response.status_code}")
                return None
                
        except Exception as e:
            self.logger.error(f"DeepSeek API调用异常: {e}")
            return None
    
    def _ai_generated_template(self, project_info: Dict[str, str]) -> str:
        """AI生成模板（占位符，实际由generate_ai_readme方法处理）"""
        return "AI生成的内容将在这里显示"
    
    def create_readme_file(self, project_path: str, template_type: str, project_info: Dict[str, str]) -> bool:
        """
        在项目目录中创建README文件
        
        Args:
            project_path: 项目路径
            template_type: 模板类型
            project_info: 项目信息
            
        Returns:
            bool: 是否创建成功
        """
        try:
            # 检查README文件是否已存在
            if self.check_readme_exists(project_path):
                self.logger.info(f"README.md文件已存在，跳过生成: {project_path}")
                return True
            
            # 根据模板类型生成内容
            if template_type == 'AI智能生成':
                readme_content = self.generate_ai_readme(project_path, project_info)
                if not readme_content:
                    self.logger.warning("AI生成失败，使用基本模板")
                    readme_content = self.generate_readme_content('项目说明', project_info)
            else:
                readme_content = self.generate_readme_content(template_type, project_info)
            
            # 创建README文件
            readme_path = os.path.join(project_path, 'README.md')
            with open(readme_path, 'w', encoding='utf-8') as f:
                f.write(readme_content)
            
            self.logger.info(f"README.md文件创建成功: {readme_path}")
            return True
            
        except Exception as e:
            self.logger.error(f"创建README文件失败: {e}")
            return False
    
    def ai_modify_readme(self, current_content: str, modify_requirements: str, project_info: Dict[str, str]) -> Optional[str]:
        """
        AI二次调整README内容
        
        Args:
            current_content: 当前README内容
            modify_requirements: 修改需求
            project_info: 项目信息
            
        Returns:
            str: 调整后的README内容
        """
        try:
            from core.deepseek_ai import deepseek_ai
            
            # 构建AI提示
            prompt = f"""请根据以下修改需求调整README内容：

修改需求：{modify_requirements}

当前README内容：
```markdown
{current_content}
```

项目信息：
- 项目名称：{project_info.get('name', '')}
- 项目描述：{project_info.get('description', '')}
- 作者：{project_info.get('author', '')}

请保持README的原有结构和格式，只根据修改需求进行必要的调整。返回完整的调整后的README内容。"""
            
            # 调用DeepSeek AI
            modified_content = deepseek_ai.generate_text(prompt)
            
            if modified_content:
                self.logger.info("AI成功调整README内容")
                return modified_content.strip()
            else:
                self.logger.warning("AI调整README失败，返回None")
                return None
                
        except Exception as e:
            self.logger.error(f"AI调整README时出错: {str(e)}")
            return None


# 创建全局实例
readme_generator = ReadmeGenerator()
